/*
 * @Author: 溜溜的陈 525767273@qq.com
 * @Date: 2024-12-13 14:40:16
 * @LastEditors: 溜溜的陈 525767273@qq.com
 * @LastEditTime: 2025-01-02 10:56:51
 * @FilePath: \express-serve\index.js
 */
// 安装了nodemon来监听文件变化，自动重启服务器
// 命令:nodemon 启动文件名
// postman测试或者apifox测试
const express = require('express')
const app = express()
const path = require('path')
const cors = require('cors')// 跨域
// const { expressjwt } = require('express-jwt')



const port = 3000
const secretKey = 'chen@liu%liu#5257'

// app.use(expressjwt({ secret: secretKey, algorithms: ["HS256"] }))// token验证
app.use(cors())// 跨域
// ------------------------模板引擎的设置----------------------------------
app.set('views', path.join(__dirname, 'views')) //设置模板文件存放的目录
// app.set('view engine', 'ejs')  //设置模板引擎，还有jade引擎，pug引擎
app.set('view engine', 'html') //设置模板引擎
app.engine('html', require('ejs').__express); //设置html模板引擎
// ---------------------get和post方案和req和res----------------------------

// -------------------------关于路由--------------------------------
// 基础路由
// 使用router管理路由，将路由抽离出来
// const userRouter = express.Router()
// userRouter.get('/login', (req, res) => {
// 	res.send('user login')
// }) 
// user/login
// app.use('/user', userRouter)
// 分离到新的文件夹，统一的管理Router文件夹管理路由
const userRoter = require('./router/user')

// 模块化以后的中间件
//  const urlencoded = require('./middleware/urlencoded')
// 闭包是可以传参数
// app.use(urlencoded())
// 内置中间件
app.use(express.json()) //解析json格式的数据,express自带的中间件,application/json;解析json格式的数据--前端传递过来的参数
app.use(express.urlencoded({ extended: false }));
//解析表单格式的数据,extended: false表示使用querystring模块来解析数据express.urlencoded，只能解析 application/x-www-form-urlencoded 类型的数据。
//  如果extended: true表示使用qs模块来解析数据，可以解析更多的数据类型，包括application/json、application/x-www-form-urlencoded、multipart/form-data等。
//关于静态资源的内置中间件
app.use(express.static(path.join(__dirname, 'public'))) //静态资源的发送  
// ------
app.post('/userscoped', (req, res) => {
	console.log(req.body, 'body');
})
app.use('/user', userRoter)
//第三方中间件
// cookie-parser解析cookie
app.get('/cookie', (req, res) => {
	res.cookie('key', 'value', {
		maxAge: 1000 * 60 * 60 * 24, //单位是ms，最大存在时间
		// httpOnly: true //只能在服务器端访问，不能在客户端访问
	})
	res.send('cookie')
})
app.get('/clearcookie', (req, res) => {
	res.clearCookie('key')   //清除cookie
	res.send('clearcookie')
})
// 错误信息中间件处理
// 四个参数必写(err,req,res,next)
// 如何传递错误信息，next('错误信息')
// app.use((err, req, res, next) => {
// 	res.status(401).send({
// 		msg:err.message,
// 		code:200
// 	})
// })





// ----------------------关于中间件-------------------------------
//一、 use中间件,参 数1：默认根路径可不写，参数2：中间件函数
// 其中next是一个函数，调用next()表示执行下一个中间件，否则会挂起
// use可以匹配所有的请求方式。use路径匹配是前缀匹配，只要前缀匹配就会执行
// 一个use可以写多个中间件函数，中间件函数的执行顺序是按照代码的顺序执行的
// app.use('/', (req, res, next) => {
// 	console.log('中间件')
// 	next()
// }, (req, res) => {
// 	res.send('中间件')
// })

// 二、 METHOD中间件和all中间件,相等匹配，路径全相等。
// app.get('/', (req, res, next) => {
// 	// console.log('中间件1');
// 	next('route') //跳过当前中间件，执行下一个中间件，路由独有的
// }, (res, req, next) => {
// 	// console.log('中间件2')
// 	next()
// })
// app.post('/', (req, res,next) => {})
// app.all('/', (req, res,next) => {})  //匹配所有的请求方式

// -----------------------------END----------------------------------

// app.get('/', (req, res) => {
// 	// console.log(req.query, 'query');
// 	// console.log(req.path, 'path');
// 	// console.log(req.url, 'url');
// 	// console.log(req.headers, 'headers');
// 	res.send('express-homes')
// 	// res主要是用来响应客户端的请求
// })
// app.get('/user/:id', (req, res) => {
// 	//params参数 res风格
// 	// user/:id  id是params参数，user/123
// 	console.log(req.params, 'params');
// 	console.log(req.get('user-agent'));
// 	const { id } = req.params

// 	res.render('index', {
// 		id,
// 		title: 'title标题',
// 		content: '内容',
// 		userList: [
// 			{ name: '张三', age: 18 },
// 			{ name: '李四', age: 19 },
// 			{ name: '王五', age: 20 }
// 		]
// 	})
// 	//res.status(200).send('express-homes2')
// })



// 静态文件发送
// app.get('/files', (req, res) => {
// 	res.sendFile(path.join(__dirname, 'public', '1.txt')) //静态文件的发送
// })
// 端口监听
app.listen(port, () => {
	console.log(`服务器在${port}接口，启动成功`)
})


